package com.dream52.pms.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Random;


/**
 * ���֣��ַ���������
 */
public class NumberUtil {
  static Random rand = null;

  public NumberUtil() {
  }

  /**
   * ������������
   * @param num int[]
   * @return ����������
   */
  public static int[] sortByAsc(int num[]) {
    return sortByAscA(num);
  }

  private static int[] sortByAscA(int num[]) {
    int length = num.length;
    int rst[] = new int[length];
    for (int i = 0; i < length; i++)
      rst[i] = num[i];
    int temp = 0;
    for (int i = 0; i < length; i++) {
      for (int j = i + 1; j < length; j++) {
        if (rst[i] > rst[j]) {
          temp = rst[i];
          rst[i] = rst[j];
          rst[j] = temp;
        }
      }
    }
    return rst;
  }

  /**
   * �������з��ַ�
   * @param value �����ַ���
   * @return �ָ�����������
   */
  public static int[] getNumber(String value) {
    String id[] = StringUtil.split(value, ',');
    return getNumber(id);
  }

  /**
   * ���ַ���������������
   * @param value �����ַ���
   * @return �ָ�����������
   */
  public static int[] getNumber(String[] value) {
    int value1[] = new int[value.length];
    for (int i = 0; i < value.length; i++) {
      if (value[i] != null && value[i].length() > 0)
        value1[i] = Integer.parseInt(value[i]);
      else
        value1[i] = 0;
    }
    return value1;
  }

  /**
   * ����������������
   * @param i ����1 
   * @param j ����2
   */
  private static void sortAsc(int i, int j) {
    int temp;
    if (i < j) {
      temp = i;
      i = j;
      j = temp;
    }
  }

  /**
   * ���number����������������������ֵΪmaxvalue
   *
   * @param number �������?
   * @param maxvalue maxvalue
   * @return number���������?
   */
  public static int[] getNumberList(int number, int maxvalue) {
    return getNumberListA(number, maxvalue);
  }

  private static int[] getNumberListA(int number, int maxvalue) {
    int rst[] = new int[number];
    if (maxvalue < number)
      return null;
    else if (maxvalue == number) {
      for (int i = 0; i < number; i++)
        rst[i] = i;
    } else {
      for (int i = 0; i < number; i++) {
        rst[i] = getRandomNumber(maxvalue);
        for (int j = 0; j < i; j++) {
          while (rst[i] == rst[j]) {
            j = 0;
            rst[i] = getRandomNumber(maxvalue);
          }
        }
      }
    }
    return rst;
  }

  /**
   *��������
   * @param maxvalue ����?
   * @return �����?
   */
  public static int getRandomNumber(int maxvalue) {
    return getRandomNumberA(maxvalue);
  }

  /**
   * ��ʽ��Ϊ��λС�����С��?
   * @param value double������ֵ
   * @return ��ʽ������ַ���?
   */
  public static String FormatNumber(double value) {
    return FormatNumber(value, "##0.00");
  }

  /**
   * ��ʽ��Ϊ��λС�����С��?
   * @param value ������ֵ
   * @return ��ʽ���С��?
   */
  public static String FormatNumber(float value) {
    return FormatNumber(value, "##0.00");
  }

  /**
   * ��ʽ������Ϊ�̶��ַ��ĸ�ʽ
   * @param value ������
   * @param pattern ��ʽ����  ###��##.00�ĸ�ʽ
   * @return  �̶����ֵ��ַ�
   */
  public static String FormatNumber(double value, String pattern) {
    double newvalue = round(value, getBits(pattern));
    DecimalFormat myFormatter = new DecimalFormat(pattern);
    return myFormatter.format(newvalue);
  }

  /**
   * ���С��λ��?
   *
   * @param pattern ��ֵ���ַ���
   * @return С���ַ���
   */
  public static int getBits(String pattern) {
    int pos = pattern.indexOf(".");
    int bits = 0;
    if (pos != -1)
      bits = pattern.length() - pos - 1;
    return bits;
  }

  /**
   * ��ʽ������Ϊ�̶��ַ��ĸ�ʽ
   * @param value ������
   * @param pattern ��ʽ����  ###,##.00�ĸ�ʽ
   * @return ����Ϊ�̶��ַ��ĸ�ʽ
   */
  public static String FormatNumber(float value, String pattern) {
    String curvalue = Float.toString(value);
    return FormatNumber(round(curvalue, getBits(pattern)).doubleValue(),
                        pattern);
//    return FormatNumber( (double) value, pattern);
  }

  /**
   * ��������
   * @param maxvalue ������ֵ
   * @return �����?
   */
  private static int getRandomNumberA(int maxvalue) {
    int random1 = 0;
    if (rand == null)
      rand = new Random();
    random1 = (int) (rand.nextDouble() * maxvalue);
    return random1;
  }

  /**
   * ��ȡ��һ��ֵ
   *
   * @param value ֵ
   * @return ��һ��ֵ
   */
  public static String getNextValue(String value) {
    int bits = value.length();
    long l = Long.parseLong(value) + 1;
    return getStringValue(l, bits);
  }

  /**
   * ��0��valueǰ�����ֵ����getStringValue(333,5)������Ϊ00333
   *
   * @param value long��ֵ
   * @param bits ֵλ��
   * @return ��������?
   */
  public static String getStringValue(long value, int bits) {
    String rst = "";
    String valuestr = value + "";
    if (valuestr.length() < bits)
      rst = getMuliString(bits - valuestr.length(), "0") + valuestr;
    else
      rst = valuestr;
    return rst;
  }

  /**
   * ��0��valueǰ�����ֵ����getStringValue(333,5)������Ϊ00333
   *
   * @param value ��ֵ
   * @param bits ֵλ��
   * @return ��������?
   */
  public static String getStringValue(int value, int bits) {
    String rst = "";
    String valuestr = value + "";
    if (valuestr.length() < bits)
      rst = getMuliString(bits - valuestr.length(), "0") + valuestr;
    else
      rst = valuestr;
    return rst;
  }

  /**
   * ��ø����ַ�������getMuliString(2, "abc"),�򷵻�"abcabc"
   *
   * @param number ���ƴ�����1,2,3,...
   * @param str �ַ���
   * @return ���ƺ���ַ�����numberΪ�㷵�ؿ�
   */
  public static String getMuliString(int number, String str) {
    String rst = "";
    for (int i = 0; i < number; i++)
      rst += str;
    return rst;
  }

  /**
   * �ַ������ӣ�headstr+System.currentTimeMillis()+tailstr
   *
   * @param headstr ��ʼ�ַ�
   * @param tailstr �м��ַ�
   * @return ���Ӻ���ַ���?
   */
  public static String getDateString(String headstr, String tailstr) {
    String rst = "";
    long l = System.currentTimeMillis();
    rst = headstr + l + tailstr;
    return rst;
  }

  /**
   * �ַ������ӣ�headstr+System.currentTimeMillis()+tailstr+һ�������?
   *
   * @param headstr ��ʼ�ַ�
   * @param tailstr �м��ַ�
   * @param bits ��������
   * @return ���Ӻ���ַ���?
   */
  public static String getDateStringLinkRandNum(String headstr, String tailstr,
                                                int bits) {
    String rst = "";
    long l = System.currentTimeMillis();
    rst = headstr + l + tailstr + getRandomNumber(bits);
    return rst;
  }

  /**
   * ��valueǰ����leng���ո񣬲��Һ�����dotlengλС�����?
   *
   * @param value ֵ
   * @param leng �ո����?
   * @param dotleng С��λ��
   * @return �ı�����ֵ
   */
  public static String FormatNumber(float value, int leng, int dotleng) {
    int num = 1;
    for (int i = 0; i < dotleng; i++)
      num = num * 10;
    value = value * num;
    Float f1 = new Float(value);
    int curvalue = f1.intValue();
    String rst = "";
    rst = FormatNumber(curvalue, leng);
    rst = rst.substring(0, rst.length() - dotleng) + "." +
        rst.substring(rst.length() - dotleng);
    return rst;
  }

  /**
   * ��valueǰ����leng���ո�
   *
   * @param value ֵ
   * @param leng �ո����?
   * @return ���ӿո����ַ���
   */
  public static String FormatNumber(int value, int leng) {
    String rst = "" + value;
    int valueleng = rst.length();
    for (int i = valueleng; i < leng; i++)
      rst = " " + rst;
    return rst;
  }

  /**
   * ������ת��Ϊ��д�������ֵ����?1.33ת����Ϊ��ʰҼԪ��������
   * 
   * @param value double�ַ��� 
   * @return ��д���ַ���
   */
  public static String getChinaDollar(double value) {
    String nchina = "��Ҽ��������½��ƾ�?";
    String china = "�ֽ�Ԫʰ��Ǫ��ʰ��Ǫ��ʰ��Ǫ";
    Double newvalue = new Double(value * 100 + 0.5);
    long iValue = newvalue.longValue();
    String rst = "";
    String temp = iValue + "";
    for (int i = temp.length(); i > 0; i--) {
      String c = temp.substring(i - 1, i);
      String a = nchina.substring(Integer.parseInt(c), Integer.parseInt(c) + 1);
      String b = china.substring( (temp.length() - i), (temp.length() - i + 1));
      rst = a + b + rst;
    }
    return rst;
  }

  /**
   * �����������?
   * 
   * @param value ֵ
   * @param scale С��λ��
   * @return ��������������ֵ
   */
  public static double round(double value, int scale) {
    String curvalue = Double.toString(value);
    return round(curvalue, scale).doubleValue();
  }

  /**
   * ��������������
   *
   * @param value ֵ
   * @param scale ֵ
   * @return ��������������ֵ
   */
  public static BigDecimal round(String value, int scale) {
    if (scale < 0) {
      throw new IllegalArgumentException(
          "The scale must be a positive integer or zero");
    }
    BigDecimal b = new BigDecimal(value);
    BigDecimal one = new BigDecimal("1");
    return b.divide(one, scale, BigDecimal.ROUND_HALF_UP);
  }

  public static void main(String argv[]) {
//    double f=15371425.2627d;
    /*    double[] f = {
            1235371425.2650d, 1235371425.2149d, 1235371425.2150d,
            122233335371425.2650d, 12333335371425.2149d, 1235371422325.2150d};
     */
//	System.out.println(NumberUtil.getNumberList(31,4444));
	
    int [] f = NumberUtil.getNumberList(2,4);
//    double d=new Float(f).doubleValue();
    for (int i = 0; i < f.length; i++) {
      // System.out.println(getChinaDollar(f[i]));
      System.out.println("f1=" + f[i]);
//      System.out.println(FormatNumber(f[i], "###.00"));
//      System.out.println(round(f[i],2));
    }
  }

}